Technical Note TN2014
Insights on OpenGL

目次

このテクニカルノートでは、Machintosh の OpenGL とグラフィックスに関する各種の問題について説明します。QuickTime と DrawSprocket の統合、フレームの分裂や意図しないジオメトリクリッピングといった問題のほかに、よくある質問に対する説明と回答も取り上げます。

このテクニカルノートは、OpenGL と 3D グラフィックス全般に精通しているアプリケーションデベロッパを対象としています。

 更新:[2001 年 3 月 26 日]






OpenGL ジオメトリが表示されない

OpenGL ジオメトリの一部が画面に描画されない原因は色々考えられますが、その中でも特に一般的なのが次の 2 つです。

  1. サーフェスが、ビューフラスタム(視錐台)の 1 つまたは複数の面によってクリップされている。
  2. カメラがサーフェスの裏側を指している。
    - 法線が逆向きになっている
    - カメラ座標またはビューポイント座標が間違っている

ビューが真っ暗な場合は、カメラ全体が間違った方向を向いている可能性があります。通常これは、カメラの位置が z 軸上で前過ぎまたは後ろ過ぎの位置にあるか、カメラを間違ったビュー座標に向けていることが原因です。デフォルトのカメラ位置は(0.0, 0.0, 0.0)で、z 軸を負の方向に向いています。

先頭に戻る

QuickTime ムービーの出力

QuickTime ムービーの出力として、OpenGL を使うには、QuickTime ムービーの各フレームを GWorld にロードした後、テクスチャとして OpenGL ポリゴンにアップロードし、サーフェスを表示する必要があります。次の URL から、サンプルコードを入手できます。

http://developer.apple.com/samplecode/Sample_Code/Graphics_3D/OpenGL_Movie.htm

各フレームをテクスチャとしてムービーから抽出したら、それを OpenGL のポリゴンに適用する必要があります。テクスチャの v 座標を反転させるか、逆の順序でロードしないと、ムービーが上下逆に再生されてしまいます。詳細については、アップルのデベロッパ・サイトにある「OpenGL Movie」のサンプル・コードを参照してください。

先頭に戻る

「ネイティブ」ピクセル形式

ネイティブピクセル形式は、32 ビットの ARGB 8888 と 16 ビットの ARGB 1555 です。パックドピクセル方式を使うと、OpenGL パイプラインを介してこれらのネイティブ形式をサポートできます。

先頭に戻る

パックドピクセルの有効化

パックドピクセルは、Macintosh では OpenGL 1.2 以上でサポートされています。これは、レンダラのバージョン文字列をチェックすることによって確認できます。エクステンションの "GL_APPLE_PACKED_PIXELS" を通じてパックドピクセルをサポートしているレンダラもあります(ATI ドライバによって戻される実際の文字列は "GL_APPLE_PACKED_PIXEL" である点に注意してください)。

ピクセル形式を選択したら、ピクセルが OpenGL を通じて、確実に指定の形式で渡されるように、'AGL_NO_RECOVERY' を使う必要があります。

以下に、OpenGL のピクセル形式に最適な選択肢を示します。



        16 ビット:
            ピクセル形式    : GL_BGRA_EXT
            ピクセルタイプ     : GL_UNSIGNED_SHORT_1_5_5_5_REV
        32 ビット:
            ピクセル形式    : GL_BGRA_EXT
            ピクセルタイプ     : GL_UNSIGNED_SHORT_1_5_5_5_REV


先頭に戻る

VBL 同期

アプリケーションのフレームレートとモニタのリフレッシュレートの同期させる(VBL 同期)には、次のコードを使います。



        GLint swapInt = 1;
        AGLSetInteger(aglContext, AGL_SWAP_INTERVAL, &swapInt);


これにより、フレームレートは、モニタの現在のリフレッシュレートの約数に固定されます。

先頭に戻る

ページフリップ

ATI ドライバでは現在、RAGE 128 ベースのシステムで、遮られていないフルスクリーンのドローアブルのページフリップが可能です。ウィンドウモードのページフリップはサポートされていません。

ページフリップの利点は、ハードウェアとソフトウェアの技術の向上に伴って次第に小さくなってきています。最近のハードウェアでは VRAM から VRAM への blit 転送は非常に速いため、一般的に見られる速度の向上はせいぜい 1 秒に 2 〜 3 フレーム分です。

先頭に戻る

フレームの分裂

一般に信じられていることとは逆に、フレームの分裂は同期化の問題であって、スワップの速度とは無関係です。電子ビームが画面で描画している間に、バッファがスワップされると、分裂が発生します。この問題は、VBL 同期で解決できるはずです。

先頭に戻る

DrawSprocket との OpenGL の使用

次の URL で、フルスクリーンのサンプルを参照してください。 http://developer.apple.com/samplecode/Sample_Code/Graphics_3D/

先頭に戻る

OpenGL と QuickDraw の併用

QuickDraw を使ってフロントバッファに描画するには、描画を OpenGL と同期させる必要があります。これにより、必然的に OpenGL パイプラインは停止します(パフォーマンスの理由からお勧めはしません)。

これは、aglSwapBuffers() の呼び出し直後に glFinish() を呼び出すことによって達成できます。その後、QuickDraw を使って、フロントバッファに描画できます。バッファの内容は、次回 aglSwapBuffers() を呼び出した時点で再び無効になるため、ちらつきが発生する場合があります。推奨される解決策としては、QuickDraw を使って GWorld に描画した後、その GWorld をテクスチャとして使うか、glDrawPixels() を使って、GWorld の内容をバックバッファに直接描画することです。

先頭に戻る

Mac OS 9 および OS X におけるバッファの割り当て

Mac OS 9 は、コンテキストごとにバッファを割り当てます。作成される次のコンテキストはそれぞれ、当該コンテキスト専用の、一連の独立したバッファを持ちます。aglCreateContext() を使って、共有するコンテキストを指定することによって、バッファを Mac OS 9 のコンテキスト内で共有できます。

Mac OS 9 のハードウェアでは、ステンシルバッファ、AUX(補助)バッファ、アキュムレーションバッファはサポートされていません。

Mac OS X は、1 つのサーフェスごとにバッファを割り当てます。「サーフェス」は、Mac OS X ではドローアブルに相当します。Mac OS X では複数のコンテキストを作成し、それを単一のサーフェスにアタッチできます。指定のサーフェスで作成されたコンテキストは、すべて同じバッファセットを共有します。

また、Mac OS X は、AUX (補助)バッファと 8 ビットのステンシルバッファをサポートしています。Mac OS X のハードウェアでは、アキュムレーションバッファはサポートされていません。

先頭に戻る

今後の予定

今後、取り組む予定の問題は次のとおりです。

  • NSGL、AGL、および CGL のうち、どれを Mac OS X で使うべきか
  • CoreGraphics との OpenGL の併用
  • Machintosh で OpenGL が拡張子を処理する方法と、サポートされる拡張子

先頭に戻る

 

参考文献

OpenGL ARB OpenGL Programming Guide, 3rd Edition Addision-Wesley 刊

OpenGL ARB OpenGL Reference Manual, 3rd Edition Addision-Wesley 刊

Foley, van Dam, Feiner, Hughes 著 Computer Graphics - Principles and Practices Addision-Wesley 刊

先頭に戻る

ダウンロード

Acrobat gif

このテクニカルノートの PDF 版

ダウンロード


先頭に戻る